package com.heima.stroke.handler;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.heima.commons.domin.bo.RoutePlanResultBO;
import com.heima.commons.utils.CommonsUtils;
import com.heima.commons.utils.HttpClientUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;

@Component
public class BaiduMapClient {
    @Value("${baidu.map.api}")
    private String api;
    @Value("${baidu.map.ak}")
    private String ak;

    private final static Logger logger = LoggerFactory.getLogger(BaiduMapClient.class);

    //TODO:任务3.2-调百度路径计算两点间的距离，和预估抵达时长
    public RoutePlanResultBO pathPlanning(String origins, String destinations)  {

             Map<String, String> reqMap = new HashMap<>();
              reqMap.put("ak", ak);
              reqMap.put("origins", origins);
              reqMap.put("destinations", destinations);
              String result = null;
              logger.info("send to Baidu:{}",reqMap);
              try {
                  result = HttpClientUtils.doGet(api, reqMap);logger.info("get from Baidu:{}",result);
              } catch (Exception e) {e.printStackTrace();
              }
              JSONObject jsonObject = (JSONObject) JSON.parse(result);
              if (null != jsonObject && jsonObject.getString("status").equals("0")) {
                  JSONArray resultArray = jsonObject.getJSONArray("result");
                  if (null != resultArray && !resultArray.isEmpty()) {
                      return resultArray.toJavaList(RoutePlanResultBO.class).get(0);
                  }
              }
              return null;
          }

    }
    /**
     * 默认ak
     * 选择了ak，使用IP白名单校验：
     * 根据您选择的AK已为您生成调用代码
     * 检测到您当前的ak设置了IP白名单校验
     * 您的IP白名单中的IP非公网IP，请设置为公网IP，否则将请求失败
     * 请在IP地址为xxxxxxx的计算发起请求，否则将请求失败
     *
     * 老师给的代码：
     *  public RoutePlanResultBO pathPlanning(String origins, String destinations) {
     *         Map<String, String> reqMap = new HashMap<>();
     *         reqMap.put("ak", ak);
     *         reqMap.put("origins", origins);
     *         reqMap.put("destinations", destinations);
     *         String result = null;
     *         logger.info("send to Baidu:{}",reqMap);
     *         try {
     *             result = HttpClientUtils.doGet(api, reqMap);
     *             logger.info("get from Baidu:{}",result);
     *         } catch (Exception e) {
     *             e.printStackTrace();
     *         }
     *         JSONObject jsonObject = (JSONObject) JSON.parse(result);
     *         if (null != jsonObject && jsonObject.getString("status").equals("0")) {
     *             JSONArray resultArray = jsonObject.getJSONArray("result");
     *             if (null != resultArray && !resultArray.isEmpty()) {
     *                 return resultArray.toJavaList(RoutePlanResultBO.class).get(0);
     *             }
     *         }
     *         return null;
     *     }
     */

    /*
    public String requestGetAK(String strUrl, Map<String, String> param) throws Exception {



        Map<String, String> params = new LinkedHashMap<>();
        params.put("origins", origins);
        params.put("destinations", destinations);
        params.put("ak", ak);
        logger.info("send to BaiDu:{}", params);
        String response=requestGetAK(api,params);
        String responseMessage= null;

        //HttpClientUtils.doGet(api, params)：调用工具类HttpClientUtils中的doGet方法，发送HTTP GET请求到指定的api地址，并将params作为请求参数。
        //responseMessage：存储从百度地图API返回的响应内容（通常是JSON格式的字符串）
        responseMessage=HttpClientUtils.doGet(api,params);
        logger.info("get from BaiDu:{}",responseMessage);

        //作用：将响应内容（JSON格式的字符串）解析为JSONObject对象。
        //逻辑：
        //使用JSONObject.parse(responseMessage)将响应字符串解析为JSON对象。将解析后的对象强制转换为JSONObject类型
        // JSONObject.parse(responseMessage) 是Object类型
        JSONObject jsonObject=(JSONObject) JSONObject.parse(responseMessage);

        if(jsonObject!=null&&jsonObject.getString("status").equals("0")){
            //使用jsonObject.getJSONArray("result")获取result字段的值，该值是一个JSONArray对象。
            JSONArray resultMessage=jsonObject.getJSONArray("result");
            if(resultMessage!=null&& !resultMessage.isEmpty()){
                //如果resultMessage有效，则将其转换为RoutePlanResultBO类型的Java对象列表，并返回列表中的第一个元素。
                return resultMessage.toJavaList(RoutePlanResultBO.class).get(0);
            }
        }
        return null;



        if (strUrl == null || strUrl.length() <= 0 || param == null || param.size() <= 0) {
            return null;
        }

        StringBuffer queryString = new StringBuffer();
        queryString.append(strUrl);


        for (Map.Entry<?, ?> pair : param.entrySet()) {
            queryString.append(pair.getKey() + "=");
            //    第一种方式使用的 jdk 自带的转码方式  第二种方式使用的 spring 的转码方法 两种均可
            //    queryString.append(URLEncoder.encode((String) pair.getValue(), "UTF-8").replace("+", "%20") + "&");
            queryString.append(UriUtils.encode((String) pair.getValue(), "UTF-8") + "&");
        }


        if (queryString.length() > 0) {
            queryString.deleteCharAt(queryString.length() - 1);
        }

        java.net.URL url = new URL(queryString.toString());
        System.out.println(queryString.toString());
        URLConnection httpConnection = (HttpURLConnection) url.openConnection();
        httpConnection.connect();

        InputStreamReader isr = new InputStreamReader(httpConnection.getInputStream());
        BufferedReader reader = new BufferedReader(isr);
        StringBuffer buffer = new StringBuffer();
        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }
        reader.close();
        isr.close();
        System.out.println("AK: " + buffer.toString());
        return buffer.toString();

     */



